#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include "sistema.h"

int SISTEMA_diretorio(char * path, char * dirFinal)
{
	time_t rawtime;
	struct tm * timeinfo;
	char nomeDir [SIZE_DIRETORIO_FORMATADO];	
	
	// Pega o tempo do sistema desde o dia 1 de jan de 1970
	if(time (&rawtime) == -1) return FALSE;
	// Armazena em timeinfo o tempo baseado na timezone e no tempo do sistema
	if((timeinfo = localtime (&rawtime)) == NULL) return FALSE;
	
	// Salva em 'nomeDir' uma string no formato yyyy_mm_dd_hh_mm_ss com a data e hora corrente do sistema
	if(strftime (nomeDir ,20,"%Y_%m_%d_%H_%M_%S", timeinfo) == 0) return FALSE;

	// Formata string para o formato path/nomeDir
	if(sprintf(dirFinal,"%s/%s", path, nomeDir) < 0) return FALSE;
	
	// Cria um diretório em 'pathPasta'
	if(mkdir(dirFinal, 0777) == -1) return FALSE;

	return TRUE;
}

int SISTEMA_mkbckinfo(char * path1, char * pathdt)
{
	DIR *diretorio;
	struct dirent *dirt;
	struct tm *arq;
	struct stat attrib;
	FILE * filWrite;

	char temp [100];
	
	// Coloca em 'temp' a string no formato "pathdt/__bckpinfo__
	if(sprintf(temp, "%s/%s", pathdt, "__bckpinfo__") < 0 ) return FALSE;
	// Cria o arquivo "__bckpinfo__" em pathdt
	if((filWrite = fopen(temp, "a+")) == NULL) return FALSE;
	// Abre o diretório passado como parâmetro 'path'	
	if((diretorio = opendir(path1)) == NULL) return FALSE;

	// Enquanto não chegar ao fim do diretório, continua a ler a próxima entrada
	while((dirt = readdir(diretorio)) != NULL){
		// Verifica se a estrutura encontrada é um arquivo regular
		if(dirt->d_type == DT_REG){
			// Coloca em 'temp' a string no formato "path1/nomeDoArquivo"
			if(sprintf(temp, "%s/%s", path1, dirt->d_name) < 0) return FALSE; 
			// Abre o aquivo 'nomeDoArquivo' em path1 e poe suas caracteristicas em attrib
			if(stat(temp, &attrib) == -1) return FALSE;
			// Pega o tempo do arquivo
			if((arq = gmtime(&(attrib.st_mtime))) == NULL) return FALSE;
			// Monta a data da última modificação deste arquivo
			if(sprintf (temp,"%d_%d_%d_%d_%d_%d", (arq->tm_year + 1900), arq->tm_mon, arq->tm_mday, arq->tm_hour, arq->tm_min, arq->tm_sec) < 0) return FALSE;
			// Escreve em __bckinfo__ o nome do arquivo\n data da última modificação
			if(fprintf(filWrite,"%s/%s\n%s\n", pathdt, dirt->d_name, temp) < 0) return FALSE;
		}
	}
	// Fecha o diretório passado como parâmetro 'path'
	if(closedir(diretorio) == -1) return FALSE;
	// Força a limpeza do buffer, escrevendo assim tudo que está no buffer em __bckinfo__
	if(fflush(NULL) != 0) return FALSE;
	return TRUE;
}


char * SISTEMA_retbckinfo(char * path)
{
	FILE * filRead;
	char * buffer;
	long filReadSize;

	char temp [100];

	// Coloca em 'temp' a string no formato "path/__bckpinfo__
	if(sprintf(temp, "%s/%s", path, "__bckpinfo__") < 0 ) return NULL;
	// Abre o arquivo '__bckpinfo__' localizado em path
	if((filRead = fopen (temp, "r")) == NULL) return NULL;
	// Posiciona o apontador 'filRead' para o fim do arquivo
	if(fseek (filRead , 0 , SEEK_END) != 0) return NULL;
	// Retorna o valor da posição do apontador 'filRead'
	if((filReadSize = ftell (filRead)) == -1L) return NULL;
	// Posiciona o apontador 'filRead' no inicio do arquivo
  	rewind (filRead);
	// Aloca memória dinâmicamente com a quantidade de bits necessários para aramazenar todo o conteúdo de __bckpinfo__
	if((buffer = (char*) malloc (sizeof(char)*filReadSize)) == NULL) return NULL;
	// Escreve em 'buffer' o conteúdo de __bckpinfo__	
	if(fread(buffer, 1, filReadSize, filRead) != filReadSize) return NULL;
	// Fecha o arquivo aberto
	if(fclose(filRead) != 0) return NULL;
	// Força a escrita do '\0' no final do arquivo. Garante que nenhum lixo será passado a chamada
	buffer[sizeof(char)*filReadSize] = '\0';

	return buffer;
}
